package main

import "fmt"

func main() {
	//数组的长度是固定的
	arr := [...]int{1, 2, 3, 4, 5, 6, 7}
	fmt.Println(arr)
	//切片就像是动态数组
	//切片的定义
	var slle []int //定义后是空的，需要向里面添加值
	//追加值
	slle = append(slle, 12)
	//获取切片长度
	fmt.Println(len(slle))
	//获取切片容量
	fmt.Println(cap(slle))
	fmt.Println(slle)
	//第二种创建方式
	var slle1 []int = []int{1, 2, 3, 4}
	fmt.Println(slle1)
	//使用自动推导
	slle2 := []int{1, 2, 3, 45}
	fmt.Println(slle2)
	//第三种方式
	//表示创建一个切片，它的长度是10，但是从第五个下标开始
	//容量可以省略,代表长度
	slle3 := make([]int, 5, 10)
	fmt.Println(slle3)
	s := append(slle3, 2, 3, 4)
	fmt.Println(s)
	//通过下标赋值
	slle3[1] = 10
	slle3[2] = 20
	fmt.Println("slle3", slle3)
	/*
		range函数是个神奇而有趣的内置函数，你可以使用它来遍历数组，切片和字典。
		当用于遍历数组和切片的时候，range函数返回索引和元素；
		当用于遍历字典的时候，range函数返回字典的键和值。
	*/
	for v, f := range slle3 {
		fmt.Println("v,f", v, f)
	}
	//切片名本身就是一个地址
	//切片的地址和扩容
	//空切片指向内存地址下标为0的地址空间
	slle4 := []int{}
	//输出内存地址
	fmt.Printf("%p\n", slle4)
	//
	slle4 = append(slle4, 1, 2, 3, 4)
	fmt.Printf("%p\n", slle4)
	//扩容
	slle5 := make([]int, 0, 1)
	//旧扩容用一个变量接收
	olcc := cap(slle5)
	//fmt.Println(slle5)
	for i := 0; i < 10; i++ {
		slle5 = append(slle5, i)
		sll := cap(slle5)
		if olcc < cap(slle5) {
			fmt.Printf("cap:%d==%d\n", olcc, sll)
			olcc = sll

		}
		//在使用append追加数据时，长度超过容量，容量会自增
		//容量在1024字节以下时，自增量是2倍，大于1024时，每次扩容4/1
		//容量扩容为偶数
	}
}
